// 云函数入口文件
const cloud = require('wx-server-sdk')

cloud.init()

//进行云数据库初始化
const db = cloud.database()

//引入依赖实例
const rp = require('request-promise')

//音乐的接口(推荐信息)
const URL = 'http://musicapi.xiecheng.live/personalized'

//数据库中的信息放到一个变量中，稍微优化了一下代码量
const playlistCollection = db.collection('playlist')

//设置要取得条数
const MAX_LIMIT = 100

// 云函数入口函数
exports.main = async (event, context) => {
  //获取数据库中所有的信息，这么做是要排除掉重复的，让新的数据添加，重复的数据不进行添加
  //需要更改，在云函数中只能获取到100条数据，要突破这个限制
  // const list = await playlistCollection.get()

  //假设需要获取的总条数，需要计算过程，也是一个异步的过程
  const countResult = await playlistCollection.count();
  //当前总的数据一个数字
  const total = countResult.total;
  //计算取几次,向上取整
  const batchTimes = Math.ceil(total / MAX_LIMIT)
  //创建一个数组,会放入promise对象
  const tasks = []
  //进行循环，让几次得取数据最终都变为一次存放到一起
  for (let i = 0; i < batchTimes; i++) {
    //skip从第几条开始取,limit取得条数
    let promise = playlistCollection.skip(i * MAX_LIMIT).limit(MAX_LIMIT).get();
    tasks.push(promise)
  }
  let list = {
    data:[]
  }
  if (tasks.length > 0) {
    //reduce():让数组中的前项和后项某种计算，并累计最终值
    list = (await Promise.all(tasks)).reduce((acc,cur) => {
      return {
        data:acc.data.concat(cur.data)
      }
    })
  }

  //从服务器中获取到的数据
  const playlist = await rp(URL).then((res)=>{
    return JSON.parse(res).result
  })

  //声明一个数组，如果有新的数据，那么就存储到这个数组中
  const newData = [];
  for (let i = 0, len1 = playlist.length; i < len1; i++) {
    let flag = true;  //代表当前是否是重复的，true代表不重复
    for (let j = 0, len2 = list.data.length; j < len2; j++) {
      if (playlist[i].id === list.data[j].id) {
        //如果都是重复的，那么直接进行结束
        flag = false
        break;
      }
    }
    //如果都是不重复的，那么进行添加数据
    if (flag) {
      newData.push(playlist[i])
    }
  }

  // console.log(playlist)
  //需要循环出来一个个添加
  for (let i = 0, len = newData.length; i < len; i++ ) {
    await playlistCollection.add({
      data:{
        ...newData[i],
        //在这个地方添加时间，因为让最近的数据在前面，比较早的数据在后面，实时获取
        createTime:db.serverDate(), //获取服务器上的时间
      }
    }).then((res)=>{
      console.log('插入成功')
    }).catch((err)=>{
      console.log('插入失败')
    })
  }
  return newData.length
}